/*
-----------------------------------------------------------------------------
This source file is part of OGRE
    (Object-oriented Graphics Rendering Engine)
For the latest info, see http://www.ogre3d.org/

Copyright (c) 2000-2005 The OGRE Team
Also see acknowledgements in Readme.html

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA, or go to
http://www.gnu.org/copyleft/lesser.txt.
-----------------------------------------------------------------------------
*/
/* Original version Copyright (C) Scott Bilas, 2000.
 * All rights reserved worldwide.
 *
 * This software is provided "as is" without express or implied
 * warranties. You may freely copy and compile this source into
 * applications you distribute provided that the copyright text
 * below is included in the resulting source code, for example:
 * "Portions Copyright (C) Scott Bilas, 2000"
 */

#ifndef SINGLETON_H_
#define SINGLETON_H_

namespace AcquaEngine {

template <typename T> class Singleton {
protected:
    static T* ms_Singleton;
public:
    Singleton( void )
    {
        assert( !ms_Singleton && typeid(T).name() );
#if defined( _MSC_VER ) && _MSC_VER < 1200
        int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1;
        ms_Singleton = (T*)((int)this + offset);
#else
	ms_Singleton = static_cast< T* >( this );
#endif
    }
    ~Singleton( void )
        {  assert( ms_Singleton );  ms_Singleton = 0;  }

    static T& getSingleton( void )
	{	assert( ms_Singleton );  return ( *ms_Singleton ); }

    static T* getSingletonPtr( void )
	{ return ms_Singleton; }
};

template <typename T> T* Singleton <T>::ms_Singleton = 0;

}

#endif /* SINGLETON_H_ */
